package ch12_容器框架与泛型.常用集合类;

import ch12_容器框架与泛型.Product;
import ch12_容器框架与泛型.ProductUtil;

import java.util.HashSet;
import java.util.LinkedHashSet;

public class HashSetDemo {
	public static void main(String[] args) {
		HashSet<Product> set1 = new HashSet<Product>();					//哈希集合
		HashSet<HashedProduct> set2 = new HashSet<HashedProduct>(8);	//指定了初始容量
		LinkedHashSet<HashedProduct> set3 = new LinkedHashSet<HashedProduct>(8);//链式哈希集合

		Product[] ps = ProductUtil.createProducts();
		for (Product p : ps) {
			set1.add(p);		//添加到set1
			set1.add(p);		//重复添加无效
			HashedProduct hp = HashedProduct.from(p); 	//转换为HashedProduct 对象
			set2.add(hp);			//添加到set2
			set3.add(hp);			//添加到set3
		}
		System.out.println("set1:");
		ProductUtil.printProducts(set1);

		Product p = ps[ps.length - 1];		//取得之前生成的最后一个产品
		int id = p.getId();
		String name = p.getName();
		int inventory = p.getInventory();

		Product p1 = new Product(id, name, inventory);
		set1.add(p1);						//有效
//哈希码产生的依据：哈希码并不是完全唯一的，它是一种算法，
//让同一个类的对象按照自己不同的特征尽量的有不同的哈希码，
//但不表示不同的对象哈希码完全不同。也有相同的情况，看程序员如何写哈希码的算法。
		System.out.println("set1(添加后):");
		ProductUtil.printProducts(set1);

		System.out.println("set2:");
		ProductUtil.printProducts(set2);
		HashedProduct p2 = new HashedProduct(1, name, 200);
		set2.add(p2);		//无效,HashedProduct重写了hashCode()，equals(Object obj)；
		System.out.println("set2(添加后):");
		ProductUtil.printProducts(set2);

		set3.add(null);		//添加空对象
		set3.add(null);		//无效，只能添加一个空对象
		System.out.println("set3的元素：");
		ProductUtil.printProducts(set3);
	}
}
